//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Το singleton "geister" είναι global αντικείμενο που υιοθετεί άλλα global
// αντικείμενα που αφορούν στην εφαρμογή και είναι κοινά στον server και στους
// clients. Κανονικά θα έπρεπε να ονομάζεται "fantasmatakia" αλλά αυτό το όνομα
// απορρίφθηκε ως εξόχως δύσχρηστο.

geister = {
	thesiMax: 2,
	sxolioMax: 100,
	sxolioMin: 50,
};

// Η fnction "thesiWalk" διατρέχει τις επιτρεπτές θέσεις και για κάθε θέση
// καλεί callback function με παράμετρο τη θέση.

geister.thesiWalk = function(callback) {
	var thesi;

	for (thesi = 1; thesi <= geister.thesiMax; thesi++) {
		callback(thesi);
	}
}

// Η λίστα "validThesi" είναι λίστα των επιτρεπτών θέσεων με δείκτη τη θέση
// και τιμή τη θέση και κύρια χρήση της είναι ο έλεγχος της θέσης.

geister.validThesi = {};
geister.thesiWalk(function(thesi) {
	geister.validThesi[thesi] = thesi;
});

// Η function "isThesi" δέχεται ένα string και ελέγχει αν είναι δεκτό ως
// θέση παίκτη. Αν ναι, επιστρέφει τη θέση ως νούμερο, αλλιώς επιστρέφει
// false.

geister.isThesi = function(thesi) {
	if (geister.validThesi.hasOwnProperty(thesi)) return geister.validThesi[thesi];
	return false;
}

// Η function "oxiThesi" δέχεται ένα string και επιστρέφει true αν αυτό
// το string δεν είναι δεκτό ως θέση παίκτη, αλλιώς επιστρέφει false.

geister.oxiThesi = function(thesi) {
	return !geister.isThesi(thesi);
}

// Η μέθοδος "isThesi" εφαρμόζεται σε strings και επιστρέφει τη θέση ως νούμερο,
// εφόσον το ανά χείρας string είναι δεκτή θέση, αλλιώς επιστρέφει false.

String.prototype.isThesi = function() {
	return geister.isThesi(this);
}

// Η μέθοδος "oxiThesi" εφαρμόζεται σε strings και επιστρέφει true εφόσον το ανά
// χείρας string είναι απαράδεκτο ως θέση, αλλιώς επιστρέφει false.

String.prototype.oxiThesi = function() {
	return geister.oxiThesi(this);
}

// Η function "rc" δέχεται μια γραμμή και μια στήλη του ταμπλό και επιστρέφει τον
// αντίστοιχο «δείκτη θέσης» που λόγω της μονοψήφιας φύσης των δύο παραμέτρων είναι
// απλά η συνένωση των δύο, π.χ. για τη γραμμή 2 και τη στήλη 3 επιστρέφεται "23".

geister.rc = function(row, col) {
	return row + '' + col;
}

// Η function "pn" δέχεται μια θέση παίκτη και ένα νούμερο πιονιού και επιστρέφει τον
// αντίστοιχο «δείκτη πιονιού» που λόγω της μονοψήφιας φύσης των δύο παραμέτρων είναι
// απλά η συνένωση των δύο, π.χ. για τη θέση 2 και το πιόνι 3 επιστρέφεται "23".

geister.pn = function(pektis, noumero) {
	return pektis + '' + noumero;
}

geister.thesiMap = function(thesi, basi) {
	if (basi == 1) return thesi;
	return(thesi == 1 ? 2 : 1);
}
